<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    // 颠倒给定的 32 位无符号整数的二进制位。
    // 提示：
    // 请注意，在某些语言（如 Java）中，没有无符号整数类型。在这种情况下，输入和输出都将被指定为有符号整数类型，并且不应影响您的实现，因为无论整数是有符号的还是无符号的，其内部的二进制表示形式都是相同的。
    // 在 Java 中，编译器使用二进制补码记法来表示有符号整数。因此，在 示例 2 中，输入表示有符号整数 - 3，输出表示有符号整数 - 1073741825。
    var reverseBits = function (n) {
        let mask = 1; // 使用一个遮罩，每次判断二进制中的一位是0还是1，将其赋值给result
        let result = 0; // 存储结果

        // 以此对比32位二进制数
        for (let i = 0; i < 32; i++) {
            // 每次将结果左移一位，将当前数字填入空位
            // 如果将移动放在if语句之后，会导致多移动一位
            result <<= 1;

            // 判断当前位置是0还是1
            if (n & mask) {
                // 如果是1，才需要填入1
                // 如果是0，无需填入，当前位置左移后自然是0
                result += 1;
            }

            // 将遮罩左移一位，判断下一个位置
            mask <<= 1;
        }
        return result >>> 0;
    };

    console.log(reverseBits(00000010100101000001111010011100)); //18
</script>